 function groups = group_dec(problem, convergence_index)
            % 决策变量分组
            % :param problem: 测试问题实例
            % :param convergence_index: 收敛变量索引
            % :return: 分组结果

            % 计算收敛变量的数量
            convergence_size = sum(convergence_index);
            
            % 记录变量维度是否已被分组
            group_front_no = zeros(convergence_size,1,'int32');
            dec_length = problem.upper - problem.lower;
            % 初始化决策变量
            dec = rand(1,problem.D) .* dec_length + problem.lower;
            
            % 计算初始梯度
            initial_grad = problem.CalGrad(dec)';
           
            convergence_index = find(convergence_index);
            initial_grad = initial_grad(convergence_index,:);
            % initial_grad = sum(initial_grad, 2);
            % initial_grad = round(initial_grad, 3);
            front_no = 1;
            
            for index = 1:length(convergence_index)
                if group_front_no(index) ~= 0
                    continue;
                end
              
                temp_dec = dec;
                front = convergence_index(index);
                temp_dec(1, front) = 0.9 * dec_length(front) + problem.lower(front);
                % 这里图写代码方便，所有决策变量梯度都算了
                new_grad = problem.CalGrad(temp_dec)';
                new_grad = new_grad(convergence_index,:);
                abs_value = sqrt(sum((initial_grad - new_grad).^2,2));
                
                sub_group = abs_value > ((max(abs_value)-min(abs_value))/1000+min(abs_value));
                
                % 特殊处导数常数情况
                if sum(sub_group) == 0
                    sub_group(index) = true;
                end
                
                sub_group_index = find(sub_group);
                
                for idx = 1:length(sub_group_index)
                    if group_front_no(sub_group_index(idx)) ~= 0
                        group_front_no(sub_group_index) = group_front_no(sub_group_index(idx));
                    end
                end
                
                group_front_no(sub_group_index) = front_no;
                front_no = front_no + 1;
            end
            
            % 使用unique函数找出张量中的唯一值
            unique_values = unique(group_front_no);
            
            % 初始化一个空单元格数组来存储结果
            groups = {};
            
            % 遍历所有唯一值
            for value = unique_values'
                % 使用logical选择出与当前值相等的所有元素的索引
                mask = (group_front_no == value);
                indices = find(mask);
                
                % 将分组结果存储到单元格数组中
                groups{end+1} = convergence_index(indices);
            end
end
 